package com.uaf.aes.utils;

import com.alibaba.fastjson.JSONObject;
import org.apache.tomcat.util.codec.binary.Base64;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.spec.SecretKeySpec;
import java.util.HashMap;
import java.util.Map;

/**
 * @author cailu
 * @filename AESUtilsDemo
 * @description
 * @date 2020/4/30 9:24
 */
public class AESUtilsDemo {

	/** 密钥 (需要前端和后端保持一致)16位16 */
	private static final String KEY = "abcdefgabcdefg12";

	/** 算法 */
	private static final String ALGORITHMSTR = "AES/ECB/PKCS5Padding";

	public static String encrypt(String content) throws Exception {
		return encrypt(content, KEY);
	}

	public static String decrypt(String encryptStr) throws Exception {
		return decrypt(encryptStr, KEY);
	}

	/**
	 * 功能描述 加密
	 * @param content    加密的字符串
	 * @param encryptKey key值
	 * @return java.lang.String
	 * @author cailu
	 * @date 2020/5/6 10:02
	 */
	public static String encrypt(String content, String encryptKey) throws Exception {
		KeyGenerator kgen = KeyGenerator.getInstance("AES");
		kgen.init(128);
		Cipher cipher = Cipher.getInstance(ALGORITHMSTR);
		cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(encryptKey.getBytes(), "AES"));
		byte[] b = cipher.doFinal(content.getBytes("utf-8"));
		// 采用base64算法进行转码,避免出现中文乱码
		return Base64.encodeBase64String(b);

	}

	/**
	 * 功能描述 解密
	 * @param encryptStr 解密的字符串
	 * @param decryptKey 解密的key值
	 * @return java.lang.String
	 * @author cailu
	 * @date 2020/5/6 10:02
	 */
	public static String decrypt(String encryptStr, String decryptKey) throws Exception {
		KeyGenerator kgen = KeyGenerator.getInstance("AES");
		kgen.init(128);
		Cipher cipher = Cipher.getInstance(ALGORITHMSTR);
		cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(decryptKey.getBytes(), "AES"));
		// 采用base64算法进行转码,避免出现中文乱码
		byte[] encryptBytes = Base64.decodeBase64(encryptStr);
		byte[] decryptBytes = cipher.doFinal(encryptBytes);
		return new String(decryptBytes);
	}


	public static void main(String[] args) throws Exception {
		Map map = new HashMap<String, String>();
		map.put("key", "value");
		map.put("中文", "汉字");
		String content = JSONObject.toJSONString(map);
		System.out.println("加密前：" + content);

		String encrypt = encrypt(content, KEY);
		System.out.println("加密后：" + encrypt);

		String decrypt = decrypt(encrypt, KEY);
		System.out.println("解密后：" + decrypt);
	}
}
